import * as coordtransform from 'coordtransform';

/**
 * 坐标转换工具类
 * 处理GPS坐标(WGS84)到百度坐标(BD09)的转换
 */
export class CoordinateConverter {
  /**
   * WGS84坐标系(GPS)转百度坐标系(BD09)
   * @param lng 经度
   * @param lat 纬度
   * @returns 转换后的百度坐标
   */
  static wgs84ToBd09(lng: number, lat: number): MapTypes.Coordinate {
    try {
      const [bdLng, bdLat] = coordtransform.wgs84tobd09(lng, lat);
      return { lng: bdLng, lat: bdLat };
    } catch (error) {
      console.error('坐标转换失败:', error);
      // 转换失败返回原坐标
      return { lng, lat };
    }
  }

  /**
   * 百度坐标系(BD09)转WGS84坐标系(GPS)
   * @param lng 经度
   * @param lat 纬度
   * @returns 转换后的GPS坐标
   */
  static bd09ToWgs84(lng: number, lat: number): MapTypes.Coordinate {
    try {
      const [wgsLng, wgsLat] = coordtransform.bd09towgs84(lng, lat);
      return { lng: wgsLng, lat: wgsLat };
    } catch (error) {
      console.error('坐标转换失败:', error);
      return { lng, lat };
    }
  }
}

/**
 * 计算两点间距离(米)
 * @param point1 坐标点1
 * @param point2 坐标点2
 * @returns 距离(米)
 */
export function calculateDistance(
  point1: MapTypes.Coordinate,
  point2: MapTypes.Coordinate
): number {
  const R = 6371000; // 地球半径，单位米
  const dLat = degToRad(point2.lat - point1.lat);
  const dLng = degToRad(point2.lng - point1.lng);
  
  const a = 
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(degToRad(point1.lat)) * Math.cos(degToRad(point2.lat)) *
    Math.sin(dLng / 2) * Math.sin(dLng / 2);
  
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const distance = R * c;
  
  return distance;
}

/**
 * 角度转弧度
 * @param deg 角度
 * @returns 弧度
 */
function degToRad(deg: number): number {
  return deg * (Math.PI / 180);
} 